package cc.ttiot;

/**
 * 1)在控制台(Terminal)执行命令mvn package即可进行打包(可以先执行mvn clean清理生成的文件)
 * 2)打包后target下生成两个包:一个是瘦包(original-ProtectiveDoor-x.x.x.jar)一个是胖包(ProtectiveDoor-x.x.x.jar)
 * 3)胖包可通过 java -jar ProtectiveDoor-x.x.x.jar 命令执行
 * 4)在pom文件80行左右可设置主类
 * 5)在运行前要先把工程根目录下的libs文件夹中的三个jar包导入本地仓库，导入的指令相关说明文件夹中，注意指令要修改jar包位置
 * <p>
 * <p>
 * 待修改：
 * 1）pcf8591读数问题（为什么要读两次）
 * 2）异常处理
 * 3）io口输入输出模式
 * 4）同步调用、异步调用、回调
 * 5）单次插入多少条适合
 * 6）达到一个可控的采样速度
 * 7）最后对依赖进行瘦身，删除未使用依赖，去除重复依赖
 * 8）观察者模式之监听器
 * 9）打日志
 * 10）转json可以考虑自己写，库用的反射写的，效率偏低
 * 11）mysql用户问题
 * 12）clientId重复的问题
 * 13）考虑静态变量的先后赋值顺序问题：有没有可能读错数据
 * 14）MQTT连接时间问题，多长时间没发送消息自动断开连接
 * 15）对于thread类，考虑用反射写两个通用的类，一个是定时采集的，一个是保持监听的
 * 16）对于采集的接口，提供一个能设定采集频率的方法
 * 17）线程池调优
 * 18）数据库调优
 * 19）jvm调优
 * 20）springboot搭建
 * 21）改用数据库连接池
 * 22）xuggle的使用: https://blog.csdn.net/huangzhichang13/article/details/53813952
 * 23）ffmpeg
 * 24）获取图片存在本地策略应该是按时间命名，读取的时候获取他的时间然后发送，如果断网的情况下，先存到本地，当数量达到一定程度时候就删除最先前的图片然后再存
 */


import cc.ttiot.thread.dataCollectionThread.*;
import cc.ttiot.thread.dataDumpThread.DataDumpThread;
import cc.ttiot.thread.dataTransmissionThread.*;
import com.pi4j.io.i2c.I2CBus;
import com.pi4j.io.i2c.I2CDevice;
import com.pi4j.io.i2c.I2CFactory;
import com.pi4j.util.Console;

import java.io.IOException;

import static cc.ttiot.service.dataCollection.i2c.I2CCollection.*;
import static cc.ttiot.utils.IpUtils.getIpAddress;

/**
 * @Description:
 * @Author :
 * @Version :
 * @Date :
 */
public class Main {

    public static void main(String[] args) throws IOException, I2CFactory.UnsupportedBusNumberException, InterruptedException {
        // 实用程序类，用于抽象一些样板代码
        final Console console = new Console();

        // 打印程序标题
        console.title("<-- 隧道防护门监控系统项目 -->");

        // CTRL+C 退出程序
        console.promptForExit();

        //I2C初始化
        I2CBus bus = null;
        I2CDevice device = null;

        bus = I2CFactory.getInstance(RASPBERRY_I2C_BUS_NUMBER);
        System.out.println("I2C总线初始化成功");

        device = bus.getDevice(ADS1015_DEFAULT_ADDRESS);
        System.out.println("ADS-1015初始化成功");

        System.out.println(getIpAddress());

        //接近开关采集线程
        Runnable approachingSwitchThread = new ApproachingSwitchCollectThread();
        new Thread(approachingSwitchThread).start();
        //接近开关上传线程
        Runnable approachingSwitchTransmitThread = new ApproachingSwitchTransmitThread();
        new Thread(approachingSwitchTransmitThread).start();

        //温湿度采集线程
        Runnable temperatureAndHumidityCollectThread = new TemperatureAndHumidityCollectThread();
        new Thread(temperatureAndHumidityCollectThread).start();
        //温湿度上传线程
        Runnable temperatureAndHumidityTransmitThread = new TemperatureAndHumidityTransmitThread();
        new Thread(temperatureAndHumidityTransmitThread).start();

        //振动采集线程
        Runnable vibrationThread = new VibrationCollectThread(device);
        new Thread(vibrationThread).start();
        //振动上传线程
        VibrationTransmitThread vibrationTransmitThread = new VibrationTransmitThread();
        new Thread(vibrationTransmitThread).start();

        //风压采集线程
        Runnable windPressureThread = new WindPressureCollectThread(device);
        new Thread(windPressureThread).start();
        //风压上传线程
        WindPressureTransmitThread windPressureTransmitThread = new WindPressureTransmitThread();
        new Thread(windPressureTransmitThread).start();

        //数据库清理线程
        Runnable dataDumpThread = new DataDumpThread();
        new Thread(dataDumpThread).start();

        //图像采集与发送线程
        Runnable pictureCollectThread = new PictureCollectThread();
        new Thread(pictureCollectThread).start();
//        //图像发送线程
//        Runnable pictureTransmitThread = new PictureTransmitThread();
//        new Thread(pictureTransmitThread).start();
        //线程池设置的选择  https://blog.csdn.net/yangcheney/article/details/107173550

    }
}
